﻿Option Compare Text
Public Class ClasseRecherche

#Region "Déclaration des variables"

    Private objDataTable As New DataTable("TblRecherche")
    Private _strTypeDonnee As String

#End Region

    ''' <summary>
    ''' Constructeur de la classe
    ''' </summary>
    ''' <remarks>Création d'une DataTable contenant les données utiles pour construire un filtre</remarks>
    Sub New()

        ' Création des colonnes de la table
        objDataTable.Columns.Add("colTypeDonnee", GetType(String))
        objDataTable.Columns.Add("colAffichee", GetType(String))
        objDataTable.Columns.Add("colSymbole1", GetType(String))
        objDataTable.Columns.Add("colOperateur1", GetType(String))
        objDataTable.Columns.Add("colSymbole2", GetType(String))
        objDataTable.Columns.Add("colOperateur2", GetType(String))

        Dim objDataRow As DataRow = Nothing
        ' cas des chaines de caractères
        ' Ligne 1
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.String"
        objDataRow("colAffichee") = "contenant"
        objDataRow("colOperateur1") = "LIKE "
        objDataRow("colSymbole1") = "'%"
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = "%'"
        objDataTable.Rows.Add(objDataRow)
        ' Ligne 2
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.String"
        objDataRow("colAffichee") = "commençant par"
        objDataRow("colOperateur1") = "LIKE "
        objDataRow("colSymbole1") = "'"
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = "%'"
        objDataTable.Rows.Add(objDataRow)
        ' Ligne 3
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.String"
        objDataRow("colAffichee") = "exactement égal à"
        objDataRow("colOperateur1") = "LIKE "
        objDataRow("colSymbole1") = "'"
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = "'"
        objDataTable.Rows.Add(objDataRow)
        ' Ligne 4
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.String"
        objDataRow("colAffichee") = "finissant par"
        objDataRow("colOperateur1") = "LIKE"
        objDataRow("colSymbole1") = "'%"
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = "'"
        objDataTable.Rows.Add(objDataRow)

        ' Cas des nombres entiers
        ' Ligne 5
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.Int16, System.Int32" ',System.Double"
        objDataRow("colAffichee") = "égales à"
        objDataRow("colOperateur1") = "= "
        objDataRow("colSymbole1") = ""
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = ""
        objDataTable.Rows.Add(objDataRow)
        ' Ligne 6
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.Int16, System.Int32" ',System.Double"
        objDataRow("colAffichee") = "comprises entre"
        objDataRow("colOperateur1") = ">= "
        objDataRow("colSymbole1") = ""
        objDataRow("colOperateur2") = "<= "
        objDataRow("colSymbole2") = ""
        objDataTable.Rows.Add(objDataRow)
        ' Ligne 7
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.Int16, System.Int32" ',System.Double"
        objDataRow("colAffichee") = "plus petites que"
        objDataRow("colOperateur1") = "< "
        objDataRow("colSymbole1") = ""
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = ""
        objDataTable.Rows.Add(objDataRow)
        ' Ligne 8
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.Int16, System.Int32" ',System.Double"
        objDataRow("colAffichee") = "plus grandes que"
        objDataRow("colOperateur1") = "> "
        objDataRow("colSymbole1") = ""
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = ""
        objDataTable.Rows.Add(objDataRow)

        'Cas des dates
        ' Ligne 9
        'objDataRow = objDataTable.NewRow()
        'objDataRow("colTypeDonnee") = "System.DateTime"
        'objDataRow("colAffichee") = "égales à"
        'objDataRow("colOperateur1") = "= "
        'objDataRow("colSymbole1") = "'"
        'objDataRow("colOperateur2") = " "
        'objDataRow("colSymbole2") = "'"
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.DateTime"
        objDataRow("colAffichee") = "égales à"
        objDataRow("colOperateur1") = "= "
        objDataRow("colSymbole1") = "#"
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = "#"
        objDataTable.Rows.Add(objDataRow)

        ' Ligne 10
        'objDataRow = objDataTable.NewRow()
        'objDataRow("colTypeDonnee") = "System.DateTime"
        'objDataRow("colAffichee") = "comprises entre"
        'objDataRow("colOperateur1") = ">= "
        'objDataRow("colSymbole1") = "#"
        'objDataRow("colOperateur2") = "<= "
        'objDataRow("colSymbole2") = "#"
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.DateTime"
        objDataRow("colAffichee") = "comprises entre"
        objDataRow("colOperateur1") = ">= "
        objDataRow("colSymbole1") = "#"
        objDataRow("colOperateur2") = "<= "
        objDataRow("colSymbole2") = "#"
        'objDataRow("colAffichee") = "égales à"
        'objDataRow("colOperateur1") = "= "
        'objDataRow("colSymbole1") = "#"
        'objDataRow("colOperateur2") = " "
        'objDataRow("colSymbole2") = "#"
        objDataTable.Rows.Add(objDataRow)

        'cas des booléens
        'ligne 11
        objDataRow = objDataTable.NewRow()
        objDataRow("colTypeDonnee") = "System.Boolean"
        objDataRow("colAffichee") = "égales à"
        objDataRow("colOperateur1") = "= "
        objDataRow("colSymbole1") = ""
        objDataRow("colOperateur2") = " "
        objDataRow("colSymbole2") = ""
        objDataTable.Rows.Add(objDataRow)

    End Sub

    ''' <summary>
    ''' Remplir la ComboBox contenant les critères. Ex.: "égalent à", "comprisent entre", ...
    ''' </summary>
    ''' <param name="cboNameComboBox">ComboBox à remplir</param>
    ''' <param name="strTypeDonnee">Type de recherche. Ex.: "System.String", "System.Int16", ...</param>
    ''' <remarks></remarks>
    ''' <example>clRecherche.RemplirCbo(Me.cboCritere, "System.DateTime")</example>
    Public Sub RemplirCboCritere(ByVal cboNameComboBox As ComboBox, ByVal strTypeDonnee As String)

        _strTypeDonnee = strTypeDonnee

        Dim objDataView As New DataView

        Dim strFiltre As String
        strFiltre = "colTypeDonnee LIKE '*" & strTypeDonnee & "*'"

        With objDataView
            .Table = objDataTable
            .RowFilter = strFiltre
        End With

        cboNameComboBox.DisplayMember = "colAffichee"
        cboNameComboBox.DataSource = objDataView

    End Sub

    ''' <summary>
    ''' Créer un filtre de recherche
    ''' </summary>
    ''' <param name="strTypeRecherche">Valeur de la ComboBox contenant les critères de recherche. Ex.: "comprisent entre", "égalent à", ...</param>
    ''' <param name="strChampDeRecherche">Nom du champ de la table dans lequel il faut effectuer la recherche</param>
    ''' <param name="strValeur1">1ère valeur recherchée</param>
    ''' <param name="strvaleur2">2sde valeur recherchée. Utilisée pour le critère de recherche "comprisent entre"</param>
    ''' <returns>Retourne une Chaîne de caractères</returns>
    ''' <remarks></remarks>
    ''' <example>clRecherche.Filtre(Me.cboCritere.Text, Me.cboRechercherDans.Text, Me.txtRecherche1.Text, Me.txtRecherche2.Text)</example>
    Public Function Filtre(ByVal strTypeRecherche As String, ByVal strChampDeRecherche As String, _
                           ByVal strValeur1 As Object, Optional ByVal strvaleur2 As String = Nothing) As String

        ' Filtrer la DataTable de la classe afin d'obtenir les bons critères
        Dim objDataView As New DataView
        With objDataView
            .Table = objDataTable
            .RowFilter = "colTypeDonnee LIKE '*" & _strTypeDonnee & "*' AND colAffichee LIKE '" & strTypeRecherche & "'"
        End With

        If InStr(_strTypeDonnee, "String") > 0 Then
            strValeur1 = doublecote(strValeur1)
            strvaleur2 = doublecote(strvaleur2)
        End If
        If InStr(_strTypeDonnee, "Boolean") > 0 Then
            strvaleur2 = Nothing
        End If

        ' Création du filtre avec la 1ére valeur recherchée
        Dim strFiltre As String
        strFiltre = "[" & strChampDeRecherche & "] " & _
                    objDataView(0)("colOperateur1") & _
                    objDataView(0)("colSymbole1") & _
                    strValeur1 & _
                    objDataView(0)("colSymbole2")

        ' Suite du filtre avec la 2sde valeur recherchée (Si elle est spécifiée)
        If strvaleur2 IsNot Nothing Then
            strFiltre = strFiltre & " AND [" & strChampDeRecherche & "] " & _
                                        objDataView(0)("colOperateur2") & _
                                        objDataView(0)("colSymbole1") & _
                                        strvaleur2 & _
                                        objDataView(0)("colSymbole2")
        End If

        Return strFiltre

    End Function

End Class
